﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Faculty
{
    enum Sex
    {
        Male,
        Female,
        Undefined
    };

    class Student
    {
        string firstName;
        string lastName;
        Sex sex;
        DateTime dayOfBirth;
        List<int> marks;

        public Student(string firstName, string lastName, Sex sex, DateTime dayOfBirth)
        {
            this.firstName = firstName;
            this.lastName = lastName;
            this.sex = sex;
            this.dayOfBirth = dayOfBirth;
            marks = new List<int>();
        }

        public Sex GetSex()
        {
            return sex;
        }

        public string GetFirstName()
        {
            return firstName;
        }

        public string GetLastName()
        {
            return lastName;
        }

        public double GetAverageMark()
        {
            if (marks.Count == 0)
                return 0;
            return marks.Average();
        }

        //вернет true если у студента есть хотя бы одна неудовлетворительная оценка (диапазон 0-2)
        public bool HasDebt()
        {
            if (marks.Count == 0)
                return false;
            foreach (var mark in marks)
                if (mark < 3)
                    return true;
            return false;
        }

        //оценка должна быть в диапазоне 0-10.
        //если индекс не указан, оценка будет добавлена в хвост списка.
        //если индекс указан, то будет сделана попытка заменить текущую оценку на новую.
        //заменить оценку можно только существующую оценку.
        //index - это номер оценки, а не номер ячейки массива (нумерация с 1)
        public void SetMark(int mark, int index = 0)
        {
            if (mark < 0 || mark > 10)
            {
                Console.WriteLine("Оценка не может быть добавлена (значение находится за пределами дозволенного диапазона 1-10)");
                return;
            }
            if (index == 0)
            {
                marks.Add(mark);
            }
            else if (index > 0 && index < marks.Count)
            {
                marks[index - 1] = mark;
            }
            else
            {
                Console.WriteLine("Оценка не может быть заменена (не сущестувует)");
            }
        }

        //позволяет прописать пол, если при создании он не был определен.
        public void SetSex(Sex sex)
        {
            if (this.sex == Sex.Undefined)
                this.sex = sex;
            else
                Console.WriteLine("Пол уже определен.");
        }

        public void ShowInfo()
        {
            Console.WriteLine("{0} {1}, средний балл {2} (кол-во оценок: {3} )", lastName, firstName, GetAverageMark(), marks.Count);
        }

        public void ShowInfoWithMarks()
        {
            Console.WriteLine("{0} {1}, средний балл {2} (кол-во оценок: {3} )", lastName, firstName, GetAverageMark(), marks.Count);
            if (marks.Count == 0)
            {
                return;
            }
            Console.WriteLine("Оценки: ");
            foreach (var mark in marks)
            {
                Console.Write("{0}\t", mark);
            }
            Console.WriteLine();
        }

        public override string ToString()
        {
            return String.Format("{0} {1}, {2}", lastName, firstName, dayOfBirth.ToShortDateString());
        }

    }
}
